import axios from 'axios'

// 创建 axios 实例
const service = axios.create({
  baseURL: 'http://localhost:8000/api', // API 基础路径
  timeout: 15000, // 请求超时时间
  withCredentials: false // 跨域请求不携带凭证
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 显示加载提示
    uni.showLoading({
      title: '加载中...',
      mask: true
    })

    // 可以在这里添加认证令牌
    // const token = localStorage.getItem('token')
    // if (token) {
    //   config.headers['Authorization'] = `Bearer ${token}`
    // }
    return config
  },
  error => {
    // 隐藏加载提示
    uni.hideLoading()
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 隐藏加载提示
    uni.hideLoading()
    
    const res = response.data
    // 如果是文件下载，直接返回
    if (response.config.responseType === 'blob') {
      return response
    }
    // 返回数据
    return res
  },
  error => {
    // 隐藏加载提示
    uni.hideLoading()
    
    // 响应错误处理
    let message = error.message || '请求失败'
    if (error.response) {
      const { status, data } = error.response
      
      switch (status) {
        case 400:
          message = data.detail || '请求参数错误'
          break
        case 401:
          message = '未授权，请登录'
          break
        case 403:
          message = '拒绝访问'
          break
        case 404:
          message = data.detail || '请求的资源不存在'
          break
        case 500:
          message = '服务器错误'
          break
        default:
          message = `未知错误(${status})`
      }
    } else if (error.request) {
      message = '网络异常，服务器未响应'
    }
    
    // 使用 uni.showToast 显示错误信息
    uni.showToast({
      title: message,
      icon: 'none',
      duration: 2000
    })
    
    return Promise.reject(error)
  }
)

// 封装 GET 请求
export function get(url, params) {
  return service({
    url,
    method: 'get',
    params
  })
}

// 封装 POST 请求
export function post(url, data) {
  return service({
    url,
    method: 'post',
    data
  })
}

// 封装 PUT 请求
export function put(url, data) {
  return service({
    url,
    method: 'put',
    data
  })
}

// 封装 DELETE 请求
export function del(url, params) {
  return service({
    url,
    method: 'delete',
    params
  })
}

// 封装请求重试功能
export async function getWithRetry(url, params, retries = 3) {
  try {
    return await get(url, params)
  } catch (error) {
    if (retries > 0 && (error.message.includes('network') || error.message.includes('timeout'))) {
      console.log(`请求失败，正在重试，剩余重试次数: ${retries - 1}`)
      return getWithRetry(url, params, retries - 1)
    }
    throw error
  }
}

// 取消请求功能
export function cancelRequest(message) {
  if (window._axiosCancelTokenSource) {
    window._axiosCancelTokenSource.cancel(message || '请求已取消')
  }
}

export default service 